package com.example.wifi2;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private WifiManager wifiManager;
    private List<ScanResult> scanResults = new ArrayList<>();
    private ArrayAdapter<String> adapter;
    private TextView tvStatus;

    // 用于接收系统 WiFi 扫描结果广播的接收器
    private WifiScanReceiver wifiScanReceiver;
    // 用于接收自定义 WiFi 状态变化本地广播的接收器
    private LocalBroadcastReceiver wifiStatusReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
        ListView lvWifi = findViewById(R.id.lv_wifi);
        tvStatus = findViewById(R.id.tv_status);
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        lvWifi.setAdapter(adapter);

        // 初始化用于接收扫描结果的广播接收器
        wifiScanReceiver = new WifiScanReceiver();

        // 初始化用于接收本地WiFi状态变化的广播接收器
        wifiStatusReceiver = new LocalBroadcastReceiver();


        // 扫描按钮
        Button btnScan = findViewById(R.id.btn_scan);
        btnScan.setOnClickListener(v -> {
            if (checkPermissions()) {
                Log.d(TAG, "开始WiFi扫描...");
                wifiManager.startScan();

                Toast.makeText(this, "正在扫描WiFi...", Toast.LENGTH_SHORT).show(); // 给用户反馈
            } else {
                Toast.makeText(this, "需要位置权限进行WiFi扫描", Toast.LENGTH_SHORT).show();
            }
        });

        // 列表点击
        lvWifi.setOnItemClickListener((parent, view, position, id) -> {
            // 确保 scanResults 不为 null 且 position 有效
            if (scanResults != null && position >= 0 && position < scanResults.size()) {
                ScanResult result = scanResults.get(position);
                showPasswordDialog(result.SSID);
            } else {
                Log.w(TAG, "列表点击事件但 scanResults 为空或 position 无效: " + position);
            }
        });

        // 首次加载时更新当前WiFi状态 - 移至 onResume 以确保每次可见时最新
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在 Activity 恢复可见时注册广播接收器
        // 1. 注册系统广播接收器，用于接收扫描结果
        IntentFilter scanFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(wifiScanReceiver, scanFilter);
        Log.d(TAG, "WifiScanReceiver 已注册");

        // 2. 注册本地广播接收器，用于接收连接状态变化通知
        IntentFilter statusFilter = new IntentFilter(WifiReceiver.ACTION_WIFI_STATE_CHANGED);
        LocalBroadcastManager.getInstance(this).registerReceiver(wifiStatusReceiver, statusFilter);
        Log.d(TAG, "LocalBroadcastReceiver 已注册");

        // 确保 Activity 恢复时显示当前连接状态
        updateCurrentWifi();

        // 在 onResume 时触发一次扫描，以便用户看到初始列表 (可选，或者在 onCreate 时触发)
        // if (checkPermissions()) { // 可以选择性检查权限再扫描
        //     wifiManager.startScan();
        // }
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 在 Activity 不可见时取消注册广播接收器，避免内存泄露
        // 1. 取消注册系统广播接收器
        unregisterReceiver(wifiScanReceiver);
        Log.d(TAG, "WifiScanReceiver 已取消注册");

        // 2. 取消注册本地广播接收器
        LocalBroadcastManager.getInstance(this).unregisterReceiver(wifiStatusReceiver);
        Log.d(TAG, "LocalBroadcastReceiver 已取消注册");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy called");
    }


    private boolean checkPermissions() {
        // 检查ACCESS_FINE_LOCATION权限，这是进行WiFi扫描和获取连接信息所必需的
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            // 如果没有权限，请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 100);
            return false; // 权限尚未授予
        }
        return true; // 权限已授予
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限已授予，可以执行扫描
                Log.d(TAG, "位置权限已授予，触发扫描...");
                wifiManager.startScan();
                Toast.makeText(this, "权限已授予，正在扫描WiFi...", Toast.LENGTH_SHORT).show();
                // 列表将在收到 SCAN_RESULTS_AVAILABLE_ACTION 广播后更新
            } else {
                // 权限被拒绝
                Log.d(TAG, "位置权限被拒绝");
                Toast.makeText(this, "需要位置权限才能扫描和连接WiFi", Toast.LENGTH_SHORT).show();
            }
        }
    }

    // 在 WifiScanReceiver 中调用此方法来更新列表
    private void updateWifiList() {
        Log.d(TAG, "开始更新WiFi列表...");
        // 再次检查权限（尽管通常在请求后应该有权限）
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.w(TAG, "updateWifiList: 权限未授予，无法获取扫描结果");
            adapter.clear(); // 清空列表
            adapter.add("获取WiFi列表需要位置权限");
            adapter.notifyDataSetChanged();
            return;
        }

        // 获取最新的扫描结果
        scanResults = wifiManager.getScanResults();
        adapter.clear(); // 清空旧数据
        if (scanResults != null) {
            Log.d(TAG, "获取到 " + scanResults.size() + " 个扫描结果");
            if (scanResults.isEmpty()) {
                adapter.add("没有找到WiFi网络");
            } else {
                for (ScanResult result : scanResults) {
                    // 过滤掉隐藏的SSID (通常SSID为null或空字符串)
                    if (result != null && result.SSID != null && !result.SSID.isEmpty()) {
                        adapter.add(result.SSID + " (" + result.level + "dBm)");
                    }
                }
            }
        } else {
            Log.w(TAG, "wifiManager.getScanResults() 返回 null");
            adapter.add("无法获取WiFi列表");
        }
        adapter.notifyDataSetChanged(); // 通知适配器数据已改变
        Log.d(TAG, "WiFi列表更新完成");
    }

    private void showPasswordDialog(String ssid) {
        View view = LayoutInflater.from(this).inflate(R.layout.dialog_password, null);
        EditText etPassword = view.findViewById(R.id.et_password);

        new AlertDialog.Builder(this)
                .setTitle("连接 " + ssid)
                .setView(view)
                .setPositiveButton("连接", (d, w) -> {
                    String password = etPassword.getText().toString();

                    if (!password.isEmpty()) {
                        Log.d(TAG, "尝试连接到 " + ssid + "...");
                        startService(new Intent(this, AutoConnectService.class)
                                .putExtra("ssid", ssid)
                                .putExtra("password", password));
                        // 这个Toast是即时反馈，表示请求已发出
                        Toast.makeText(this, "正在尝试连接到: " + ssid, Toast.LENGTH_SHORT).show();
                    } else {
                        Log.w(TAG, "尝试连接时密码为空，这可能是开放网络或输入错误");
                        Toast.makeText(this, "密码不能为空 (如果这是开放网络，逻辑需要调整)", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton("取消", null)
                .show();
    }

    // 用于在Activity中显示当前连接的WiFi状态
    @SuppressLint("MissingPermission")
    private void updateCurrentWifi() {
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        String ssid = "<未连接>"; // 默认状态
        if (wifiInfo != null && wifiInfo.getNetworkId() != -1) {
            String rawSsid = wifiInfo.getSSID();
            // rawSsid 对于隐藏网络可能是 null 或 "<unknown ssid>"
            // 对于普通网络是带双引号的，如 "\"MyWiFi\""
            if (rawSsid != null && !rawSsid.equals("<unknown ssid>")) {
                ssid = rawSsid.replace("\"", ""); // 移除双引号
            } else {
                ssid = "<已连接，SSID未知>"; // 或者其他表示已连接但SSID不可见的方式
            }
        }
        tvStatus.setText("当前WiFi：" + ssid);
        Log.d(TAG, "更新当前WiFi状态到 TextView: " + ssid);
    }

    // --- 内部广播接收器类 ---

    // 接收系统扫描结果广播
    private class WifiScanReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
                Log.d(TAG, "收到 SCAN_RESULTS_AVAILABLE_ACTION 广播");
                // 系统扫描完成后，更新WiFi列表
                updateWifiList();
            }
        }
    }

    // 接收自定义本地广播 (来自 WifiReceiver)，用于更新连接状态 TextView 和显示 Toast
    private class LocalBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (WifiReceiver.ACTION_WIFI_STATE_CHANGED.equals(intent.getAction())) {
                Log.d(TAG, "收到本地广播 ACTION_WIFI_STATE_CHANGED");
                boolean isConnected = intent.getBooleanExtra(WifiReceiver.EXTRA_CONNECTED, false);
                String ssid = intent.getStringExtra(WifiReceiver.EXTRA_SSID); // 获取可能存在的SSID

                if (isConnected) {
                    // 已连接状态
                    String displaySsid = (ssid != null && !ssid.equals("<unknown ssid>")) ? ssid : "<SSID未知>";
                    tvStatus.setText("当前WiFi：" + displaySsid);
                    Log.d(TAG, "本地广播更新当前WiFi状态: " + displaySsid);
                    // 显示连接成功 Toast
                    Toast.makeText(MainActivity.this, "已成功连接到: " + displaySsid, Toast.LENGTH_SHORT).show();

                } else {
                    // 未连接状态 (可能包括连接失败或断开)
                    tvStatus.setText("当前WiFi：未连接");
                    Log.d(TAG, "本地广播更新当前WiFi状态: 未连接");
                    // 显示连接失败/断开 Toast
                    // 注意: 这个广播在断开连接时也会触发，所以提示文字要通用一些
                    // 如果需要区分是“尝试连接失败”还是“正常断开”，需要更复杂的逻辑（例如判断是否最近尝试过连接）
                    Toast.makeText(MainActivity.this, "WiFi状态: 未连接或连接失败", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}



